#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

/**
 * 书中提到，共享栈可以减少上溢的情况，是这样理解的
 * 在单个栈的情况，我们需要两个栈，那么这个数组的单开的
 * 如果使用共享栈，就可以把这两个栈的生成在同一个数组里面，
 * 这样做到减少上溢情况
 */

/**
 * 一个数组用作两个栈，
 * 一个栈的指针在数组开头
 * 另一个在数组末尾
 * 增长的时候是迎面增长的
 */
#define maxsize 100
#define elemtp int
typedef struct {
    elemtp stack [maxsize];//栈空间
    int top[2];//两个栈指针
}stk;
stk s;

/**
 * 给指定的栈插入值
 * @param i 栈的id
 * @param x 插入的值
 */
int push(int i,elemtp x){
    if(i<0||i>1){//if out of stack id, throw error
        printf("stack id error!\n");
        exit(0);
    }
    // below action can replace by empty() function
    if(s.top[1]-s.top[0]==1){//push的时候注意栈满条件
        printf("stack full\n");
        return 0;
    }
    switch (i){
    case 0:
    //因为初始指针默认为-1 和 n 所以都是要先操作指针，再复制!!!
        s.stack[++s.top[0]]=x;return 1;break;
        break;
    case 1:
        s.stack[--s.top[1]]=x;return 1;break;
    }
}

/**
 * 弹出操作
 * @param i 栈的id
 */
elemtp pop(int i){
    if(i<0||i>1){
        printf("stack id error!\n");
        exit(0);
    }
    switch (i){
    case 0:
        //pop的时候注意栈空的条件
        if(s.top[0]==-1){printf("stack empty\n");return -1;}
        else{return s.stack[s.top[0]--];}//pop的时候先出后移动指针
        break;
    case 1:
        if(s.top[1]==maxsize){printf("stack empty\n");return -1;}
        else{return s.stack[s.top[1]++];}
    }

    
}

